home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / fun / c64.1 next >
Internet Message Format  |  1989-05-18  |  43KB

  1. Path: xanth!ames!amdahl!oliveb!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i140:  c64 - commodore 64 emulator spoof
  5. Message-ID: <105550@sun.Eng.Sun.COM>
  6. Date: 17 May 89 15:27:20 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 1426
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: ecarroll@vax1.tcd.ie (Eddy Carroll)
  12. Posting-number: Volume 89, Issue 140
  13. Archive-name: fun/c64.1
  14.  
  15. This "C64 Emulator" was written for April Fools day of 1988. It's
  16. designed to let you fool your friends (however briefly) into thinking
  17. your Amiga is a C64.
  18.  
  19. [uuencoded executable included.  ..bob]
  20.  
  21. # This is a shell archive.
  22. # Remove anything above and including the cut line.
  23. # Then run the rest of the file through 'sh'.
  24. # Unpacked files will be owned by you and have default permissions.
  25. #----cut here-----cut here-----cut here-----cut here----#
  26. #!/bin/sh
  27. # shar: SHell ARchive
  28. # Run the following text through 'sh' to create:
  29. #    README
  30. #    makefile
  31. #    commands.c
  32. #    main.c
  33. #    screen.c
  34. #    commands.h
  35. #    screen.h
  36. #    C64.info.uu
  37. #    C64.uu
  38. # This is archive 1 of a 1-part kit.
  39. # This archive created: Wed May 17 20:22:17 1989
  40. echo "extracting README"
  41. sed 's/^X//' << \SHAR_EOF > README
  42. X
  43. X               =========================
  44. X                            C 6 4   E M U L A T O R
  45. X               =========================
  46. X
  47. XThis "C64 Emulator" was written for April Fools day of 1988. It's designed
  48. Xto let you fool your friends (however briefly) into thinking your Amiga is
  49. Xa C64. I had quite a bit of fun with this at that time, because I have
  50. Xboth a C64 and Amiga, and I've also written a fairly good "Amiga ball"
  51. Xdemonstration for the C64. With both of them running at the same time,
  52. Xpeople get very confused :-)
  53. X
  54. XAnyway, load the program by typing C64 from the CLI or click on the icon
  55. Xfrom workbench. Once loaded, you are presented with the C64 startup screen,
  56. Xand you can type in commands. The C64's usual editing facilities are
  57. Xavailable: The cursor keys move the cursor, F10 homes the cursor, F20 clears
  58. Xthe screen and DEL inserts characters at the current cursor position. All
  59. Xthe other function keys are mapped to some of the commands available.
  60. X
  61. XThe emulator knows about quite a few of the standard C64 commands - try
  62. Xout your favourites.
  63. X
  64. XModifying the commands and error messages merely requires you to edit
  65. Xthe commands.c file appropriately, and recompile.
  66. X
  67. XEddy Carroll
  68. Xecarroll@cs.tcd.ie
  69. SHAR_EOF
  70. echo "extracting makefile"
  71. sed 's/^X//' << \SHAR_EOF > makefile
  72. X#
  73. X# Aztec Make makefile, for Lattice C V4.0 :-)
  74. X#
  75. X# Commodore 64 spoof Emulator, April 1988
  76. X#
  77. X
  78. XOBJS   = main.o commands.o screen.o
  79. X#
  80. X#
  81. X#
  82. X.c.o:
  83. X    lc -s -v $*.c
  84. X#
  85. X#
  86. X#
  87. Xall: c64
  88. X
  89. Xc64: $(OBJS)
  90. X    blink from lib:c.o $(OBJS) to C64 sc sd nd map ram:map \
  91. X          lib lib:lc.lib lib:amiga.lib
  92. X
  93. Xmain.o:    main.c screen.h commands.h
  94. Xscreen.o: screen.c screen.h
  95. Xcommands.o: commands.c commands.h
  96. SHAR_EOF
  97. echo "extracting commands.c"
  98. sed 's/^X//' << \SHAR_EOF > commands.c
  99. X/*
  100. X *        Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
  101. X *
  102. X * Module: COMMANDS.C
  103. X *
  104. X * Contains definitions for the commands, error messages, and standard
  105. X * prompts used in the emulator. To change the messages, only this module
  106. X * need be recompiled.
  107. X *
  108. X */
  109. X
  110. X#include <exec/types.h>
  111. X#include "commands.h"
  112. X
  113. X/* 
  114. X * List of commands and standard responses. Each record stores a command
  115. X * name, it's length, and a "response" message for that command.
  116. X * Note: The first entry corresponds to a line number being entered.
  117. X *
  118. X */
  119. X
  120. Xstruct commandlist command[] = {
  121. X
  122. X{NULL,        4, 0,
  123. X{"Hmmm...a would-be programmer, eh?\r",
  124. X "In fact, this emulator doesn't\ractually emulate PROGRAMS.\r",
  125. X NULL
  126. X}},
  127. X{"GO AMIGA",4,0,
  128. X{"Ah - very good! If you can have GO 64\ron a C128, why not GO AMIGA\r",
  129. X"Nah...that won't work\r",
  130. XNULL
  131. X}},
  132. X{"LIST",    4, 0,
  133. X{"3 Bags Flour\r6 Doz Eggs\r1 Loaf Bread\r",
  134. X "1 3.5\42 Disk Drive\r1 Colour Monitor\r1 Amiga 500\r",
  135. X NULL
  136. X}},
  137. X{"LOAD\42$\42",    7,    0,
  138. X{"You want a directory? Try a phone\rbook instead.\r",
  139. X"Sorry - I don't feel up to disk access\rjust at the moment. In fact, \
  140. XI'm feelingrather depressed if you must know.\rBrain the size of a \
  141. Xplanet, and what\rdo people do - try and get a\rDIRECTORY. I don't know \
  142. Xwhat the\rworld is coming too...\r",
  143. X"Look, if you try that ONCE more I'll\rbe very cross\r"
  144. X}},
  145. X{"LOAD",    4, 0,
  146. X{"Erm...I'm afraid that this emulation\rdoesn't emulate the LOAD command.\r",
  147. X "And just how do you expect me to\raccomplish that on an Amiga?\r",
  148. X"Ok, I'LL load a program when YOU show\rme where you've plugged in the 1541\r"
  149. X}},
  150. X{"RUN",        3, 0,
  151. X{"Oh God, not another one of these\rkeep-fit addicts.\r",
  152. X"Can't - my ankle's twisted!\r",
  153. X NULL
  154. X}},
  155. X{"SAVE",    4, 0,
  156. X{"Yes! Yes! Yes! With the E.B.S.\r",
  157. X"Only Jesus can do that.\r",
  158. XNULL
  159. X}},
  160. X{"CLOSE",    5, 0,
  161. X{"Hmm ... another Public holiday?\r",
  162. X"Shut up, yourself!\r",
  163. XNULL
  164. X}},
  165. X{"CLR",        3, 0,
  166. X{"... as clear as mud, I reckon.\r",
  167. X"Okay, I'm thinking clearly now.\rEverything makes perfect sense\r\
  168. XDaisy, where are you now?\r",
  169. X"Pardon?\r"
  170. X}},
  171. X{"CONT",    4, 0,
  172. X{"Won't continue error\r",
  173. X"Same to you with knobs on!\r",
  174. XNULL
  175. X}},
  176. X{"DATA",    4, 0,
  177. X{"Blind data error.\r",
  178. X"You like Police records, then?\r",
  179. XNULL
  180. X}},
  181. X{"DIM",        3, 0,
  182. X{"I am not!\r",
  183. X"It's dark enough, thanks.\r",
  184. X"Okay, put on the specs, it's in\r3-d from now on.\r"
  185. X}},
  186. X{"END",        3, 0,
  187. X{".. of the universe ?\r",
  188. X"Okay, I'm finished working.\r",
  189. XNULL
  190. X}},
  191. X{"GET",        3, 0,
  192. X{"I'm not getting anymore messages\rfor you.\r",
  193. X"I got that yesterday!\r",
  194. X"I never get that kind of joke.\r"
  195. X}},
  196. X{"GOSUB",    5, 0,
  197. X{"Into submarines, are we?\r",
  198. X"Okay, but I won't return.\r",
  199. X"No! Use procedures.\r"
  200. X}},
  201. X{"GO",        2, 0,
  202. X{"I'm fed up going here, going there\rand never a word of thanks.\r",
  203. X"Now where?\r",
  204. X"I've already been there - it's very\rboring.\r"
  205. X}},
  206. X{"IF",        2, 0,
  207. X{"No 'ifs', be sure!\r",
  208. X"If I were a rich man...\r",
  209. XNULL
  210. X}},
  211. X{"INPUT",    5, 0,
  212. X{"Ask whatever you want, I'm not\rtelling.\r",
  213. X"You'll have to ask someone else.\r",
  214. XNULL
  215. X}},
  216. X{"LET",        3, 0,
  217. X{"Let bygones be bygones.\r",
  218. X"Let it be.\r",
  219. X"This computer is not to let.\r"
  220. X}},
  221. X{"NEW",        4, 0,
  222. X{"Okay, I'm brand new.\r",
  223. X"No news today .. sorry!\r",
  224. XNULL
  225. X}},
  226. X{"STOP",    4, 0,
  227. X{"Arrggghhh .. can't stop now.\r",
  228. X"Sccrreeeeech ....\r",
  229. X"Bl@@dy lollipop person!\r"
  230. X}}
  231. X
  232. X
  233. X
  234. X
  235. X};
  236. X
  237. Xint MAXCOMMANDS = 19;
  238. X
  239. X/*
  240. X * Now come the error messages, these are printed out whenever the
  241. X * emulator is given a command it doesn't recognise.
  242. X *
  243. X */
  244. X
  245. Xchar *errormsg[] = {
  246. X
  247. X"?Too many fingers on keyboard error\r",
  248. X"?String too tangled error\r",
  249. X"?Formula too boring error\r",
  250. X"?Novice programmer error\r",
  251. X"?Computer too busy error\r",
  252. X"?Atari Owner in vicinity error\r",
  253. X"?Command too trivial error\r",
  254. X"?Hardware malfunction error\r",
  255. X"?No silver lining on cloud error\r",
  256. X"?Year not a leap year error\r",
  257. X"?Hyper-space misdirection error\r",
  258. X"?Memory empty error\r",
  259. X"?No bits to bite error\r",
  260. X"?Commodore 64 incompatibility error\r",
  261. X"?Invalid lexical indicator error\r",
  262. X"?4th dimensional error\r",
  263. X"?Nth dimensional error\r",
  264. X"?Out of this world error\r",
  265. X"?Too many users on system error\r",
  266. X"?Too many characters on screen error\r",
  267. X};
  268. X
  269. Xint MAXERRORS = 20;
  270. X
  271. X/*
  272. X * Now come a few standard messages.
  273. X *
  274. X */
  275. X
  276. Xchar *STARTUP =
  277. X"\r    **** Commodore 64 Basic V2 ****\r\r\
  278. X 64K Ram System  38911 Basic Bytes Free\r\r";
  279. X
  280. Xchar *ABOUT =
  281. X"\r     *** Commodore 64 Emulator ***\r\r\
  282. X    by Eddy Carroll 1st April 1988\r\r";
  283. X
  284. Xchar *READY =
  285. X"Ready.\r";
  286. SHAR_EOF
  287. echo "extracting main.c"
  288. sed 's/^X//' << \SHAR_EOF > main.c
  289. X/*
  290. X *        Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
  291. X *
  292. X * Module: MAIN.C
  293. X *
  294. X * This module is the mainline - it handles the input loop and command
  295. X * interpretation logic.
  296. X *
  297. X */
  298. X
  299. X#include <exec/types.h>
  300. X#include <exec/io.h>
  301. X#include <intuition/intuition.h>
  302. X#include <proto/exec.h>
  303. X#include <proto/intuition.h>
  304. X#include <proto/graphics.h>
  305. X#include "screen.h"
  306. X#include "commands.h"
  307. X
  308. X#define DEL '\177'
  309. X/* 
  310. X *  Defining the following functions here stops them from being pulled into
  311. X *  the program from the Lattice library when we link.
  312. X */
  313. X
  314. Xint chkabort() {return(0);}
  315. Xvoid MemCleanup() {}
  316. X
  317. X/*
  318. X *    Global references
  319. X */
  320. X
  321. Xextern struct Menu mymenus;
  322. Xextern struct IntuiText mytext[];
  323. X
  324. Xextern struct commandlist command[];    /* Commands & Responses */
  325. Xextern char *errormsg[];                /* List of error msgs    */
  326. Xextern int  MAXCOMMANDS;                /* Number of commands    */
  327. Xextern int  MAXERRORS;                    /* Number of messages    */
  328. Xextern char *STARTUP;                    /* Startup message        */
  329. Xextern char *ABOUT;                        /* "About..." message    */
  330. Xextern char *READY;                        /* Ready prompt            */
  331. X
  332. X/*
  333. X * Executes one of the menu commands
  334. X *
  335. X */
  336. X
  337. Xvoid domenu(opt)
  338. Xint opt;
  339. X{
  340. X    CURSOROFF;
  341. X
  342. X    switch (opt) {
  343. X
  344. X    case M_ABOUT:
  345. X        clearscreen();
  346. X        if (titlebar) printchar('\r'); /* Skip past title bar if on */
  347. X        printmess(ABOUT);
  348. X        printmess(READY);
  349. X        break;
  350. X
  351. X    case M_TITLE:
  352. X        titlebar = !titlebar;
  353. X        ClearMenuStrip(mywin);
  354. X        mytext[1].IText = titlebar ? " Hide Title" : " Show Title";
  355. X        SetMenuStrip(mywin,&mymenus);
  356. X        ShowTitle(myscreen, titlebar);
  357. X        break;
  358. X
  359. X    case M_QUIT:
  360. X        cleanup(0);
  361. X        break;
  362. X
  363. X    }
  364. X}
  365. X
  366. X/*
  367. X * Returns a random number in range 0..range-1.
  368. X *
  369. X */
  370. X
  371. Xint random(range)
  372. Xint range;
  373. X{
  374. X    LONG seconds,micros;
  375. X    CurrentTime(&seconds,µs);
  376. X    return (micros % range);
  377. X}
  378. X
  379. X
  380. X/*
  381. X * Reads current line from screen into string, stripping off any extra
  382. X * leading or trailing spaces.
  383. X *
  384. X */
  385. X
  386. Xvoid getcommand(s)
  387. Xchar *s;
  388. X{
  389. X    int i = 0, j = 39;
  390. X    char *p; 
  391. X    p = screen[cursory];
  392. X    while (p[i] == ' ' && i < 40)
  393. X        i++;
  394. X    if (i == 40) {
  395. X        *s = '\0';
  396. X        return;
  397. X    } 
  398. X
  399. X    while (p[j] == ' ')
  400. X        j--;
  401. X    while (i <= j) {
  402. X        *s++ = toupper(p[i]);
  403. X        i++;
  404. X    }
  405. X    *s = '\0';
  406. X}
  407. X
  408. X
  409. X/*
  410. X * Returns TRUE if the first n chars of the two strings are equal, else
  411. X * returns FALSE
  412. X *
  413. X */
  414. X
  415. Xint match(s1,s2,n)
  416. Xchar *s1,*s2;
  417. Xint n;
  418. X{
  419. X    while (*s1++ == *s2++ && n)
  420. X        n--;
  421. X    return (!n);
  422. X}
  423. X
  424. X
  425. X/*
  426. X * Initialises error messages to be in random order.
  427. X *
  428. X */
  429. X
  430. Xvoid initerror()
  431. X{
  432. X    int i, x, y;
  433. X    char *p;
  434. X
  435. X    for (i = 0; i < MAXERRORS; i++) {
  436. X        x = random(MAXERRORS);
  437. X        y = MAXERRORS - 1 - random(MAXERRORS);
  438. X        p = errormsg[x];
  439. X        errormsg[x] = errormsg[y];
  440. X        errormsg[y] = p;
  441. X    }
  442. X}
  443. X
  444. X
  445. X/*
  446. X * Prints a suitable response for command in string s. If a match is found
  447. X * in the command list, then a reponse appropriate to that command is
  448. X * printed, else one of the standard error messages is printed.
  449. X *
  450. X */
  451. X
  452. Xvoid docommand(s)
  453. Xchar *s;
  454. X{
  455. X    static int curerr = 0;
  456. X    int i = 1, k = -1, x, y;
  457. X    char *p;
  458. X    struct commandlist *com;
  459. X
  460. X    if (*s >= '0' && *s <= '9')
  461. X        k = 0;
  462. X    else {
  463. X        while (i < MAXCOMMANDS && k < 0) {
  464. X            if (match(command[i].asc,s,command[i].len))
  465. X                k = i; 
  466. X            i++;
  467. X        }
  468. X    }
  469. X
  470. X    printchar('\r');
  471. X    if (k >= 0) {
  472. X        com = &command[k];
  473. X        do {
  474. X            com->num++;
  475. X
  476. X            /* If we have printed all three messages once each, re-arrange    */
  477. X            /* the order of them before we print them again to make it        */
  478. X            /* seem random.                                                    */
  479. X
  480. X            if (com->num >= MAXRESPONSE) {
  481. X                com->num = 0;
  482. X                x = random(MAXRESPONSE); y = random(MAXRESPONSE);
  483. X                p = com->response[x];
  484. X                com->response[x] = com->response[y];
  485. X                com->response[y] = p;
  486. X            }
  487. X        } while ((p = com->response[com->num]) == NULL);
  488. X        printmess(p);
  489. X    } else {
  490. X        printmess(errormsg[curerr]);
  491. X        curerr++;
  492. X        if (curerr >= MAXERRORS) {
  493. X            curerr = 0;
  494. X            initerror();
  495. X        }
  496. X    }
  497. X
  498. X    printmess(READY);
  499. X}
  500. X
  501. X
  502. X/*
  503. X * Initialises the message headers to point to random messages
  504. X *
  505. X */
  506. X
  507. Xvoid initmess()
  508. X{
  509. X    int i;
  510. X    for (i = 0; i < MAXCOMMANDS; i++)
  511. X        command[i].num = random(3);
  512. X}
  513. X
  514. X
  515. X/*
  516. X *  Returns code for function key n, where n = 0..20
  517. X *  Returns 0 if no char equivalent. Also binds otherwise undefined
  518. X *  function keys to common commands recognised.
  519. X */
  520. X
  521. Xchar fkey(n)
  522. Xint n;
  523. X{
  524. X    register char ch = 0;
  525. X    switch (n) {
  526. X
  527. X    case 9:        ch = C_HOME;
  528. X                break;
  529. X    case 19:    ch = C_CLEAR;
  530. X                break;
  531. X    case 20:     printmess("HELP");
  532. X                break;
  533. X    default:    if (n >= 0 & n <= 19)
  534. X                    printmess(command[n].asc);    /* Get command & print it */
  535. X                break;
  536. X    }
  537. X    return (ch);
  538. X}
  539. X
  540. X/*
  541. X * Converts code (an escape character) into one of the internal codes
  542. X * (or 0 if no corresponding code)
  543. X *
  544. X */
  545. X
  546. Xchar convert(ch)
  547. Xchar ch;
  548. X{
  549. X    switch (ch) {
  550. X
  551. X    case 'A': ch = C_UP;        break;
  552. X    case 'B': ch = C_DOWN;        break;
  553. X    case 'C': ch = C_RIGHT;        break;
  554. X    case 'D': ch = C_LEFT;        break;
  555. X
  556. X    default:  ch = 0;
  557. X    }
  558. X
  559. X    return(ch);
  560. X}
  561. X
  562. X/*
  563. X * Mainline
  564. X *
  565. X */
  566. X
  567. Xvoid _main()
  568. X{
  569. X    LONG MenuNumber;
  570. X    struct MenuItem *item;
  571. X    register struct IntuiMessage *message;
  572. X    register struct Message *conmessage;
  573. X    int escape = 0;
  574. X    LONG class;
  575. X    USHORT code;
  576. X    int time = 3, curstate = 0, fkeynum;
  577. X    char s[50], ch;
  578. X
  579. X
  580. X    titlebar = 0;    /* Initially hidden */
  581. X    initscreen();
  582. X    initmess();
  583. X    initerror();
  584. X    printmess(STARTUP);
  585. X    printmess(READY);
  586. X    CURSORON;
  587. X
  588. X
  589. X    /* Main loop */
  590. X
  591. X#define INTUIBITS    (1 << mywin->UserPort->mp_SigBit)
  592. X#define CONSOLEBITS    (1 << ConReadPort->mp_SigBit)
  593. X
  594. X    while (1) {
  595. X
  596. X        /* Reset message pointers, just in case 2nd part of conditional */
  597. X        /* && isn't executed. */
  598. X        message    = NULL;
  599. X        conmessage = NULL;
  600. X
  601. X        while ((message = (struct IntuiMessage *)
  602. X                    GetMsg(mywin->UserPort)) == NULL &&
  603. X                (conmessage = (struct Message *)
  604. X                    GetMsg(ConReadPort)) == NULL)
  605. X            Wait ( INTUIBITS | CONSOLEBITS);
  606. X
  607. X
  608. X        if (message) {        /* Got an IntuiMessage */
  609. X            class = message->Class;
  610. X            code = message->Code;
  611. X            ReplyMsg((struct Message *)message);
  612. X
  613. X            switch (class) {
  614. X
  615. X            case MENUPICK:
  616. X                MenuNumber = code;
  617. X                while (MenuNumber != MENUNULL) {
  618. X                    item = (struct MenuItem *)ItemAddress(&mymenus,MenuNumber);
  619. X                    code = item->Command;
  620. X                    MenuNumber = item->NextSelect;
  621. X                }
  622. X                domenu(code);
  623. X                break;
  624. X
  625. X            case INTUITICKS:
  626. X                if (time == 0) {
  627. X                    curstate = 1 - curstate;
  628. X                    if (curstate)
  629. X                        CURSORON;
  630. X                    else
  631. X                        CURSOROFF;
  632. X                    time = 3;
  633. X                } else --time;
  634. X                break;
  635. X
  636. X            }
  637. X        }
  638. X
  639. X        if (conmessage) {        /* Character from console */
  640. X            ch = *constring;
  641. X            /* Retrieve char, then line up request for next char */
  642. X            QueueRead(ConReadReq,constring);
  643. X            if (ch == CSI)
  644. X                escape = 1, fkeynum = 0;
  645. X            else {
  646. X                if (escape) {
  647. X                    if (isdigit(ch))
  648. X                        fkeynum = fkeynum * 10 + ch - '0', ch = 0;
  649. X                    else if (ch == '?')
  650. X                        fkeynum = 20, ch = 0;
  651. X                    else if (ch == ' ')
  652. X                        escape = 2, ch = 0;
  653. X                    else {
  654. X                        escape = 0;
  655. X                        if (ch == '~')
  656. X                            ch = fkey(fkeynum);
  657. X                        else if (escape != 2)
  658. X                            ch = convert(ch);
  659. X                    }
  660. X                }
  661. X                CURSOROFF;
  662. X                if (ch == '\r') {
  663. X                    getcommand(s);    /* Read command from screen */
  664. X                    printchar(ch);
  665. X                    if (*s)
  666. X                        docommand(s);
  667. X                } else {
  668. X                    if (ch == DEL)        /* If delete key (Ascii #127)    */
  669. X                        ch = C_INSERT;    /* Make it act as insert        */
  670. X                    printchar(ch);
  671. X                }
  672. X                CURSORON;
  673. X                time = 3;
  674. X                curstate = 1;
  675. X            }
  676. X        }
  677. X    }
  678. X}
  679. SHAR_EOF
  680. echo "extracting screen.c"
  681. sed 's/^X//' << \SHAR_EOF > screen.c
  682. X/*
  683. X *        Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
  684. X *
  685. X * Module: SCREEN.C
  686. X *
  687. X * This module contains the various screen handling routines used by
  688. X * the emulator.
  689. X *
  690. X */
  691. X
  692. X#define  SCREEN
  693. X
  694. X#include <exec/types.h>
  695. X#include <exec/io.h>
  696. X#include <intuition/intuition.h>
  697. X#include <proto/exec.h>
  698. X#include <proto/graphics.h>
  699. X#include <proto/intuition.h>
  700. X#include "screen.h"
  701. X
  702. Xstruct RastPort *rp;
  703. Xint openconsole = 0;
  704. X
  705. Xstruct NewScreen NewScreen = {
  706. X    0,0,320,200,    /* Screen position & size     */
  707. X    2,                /* 2 bitplanes = 4 colours     */
  708. X    0,1,            /* Default text colours        */
  709. X    0,                /* Lores, non-interlace        */
  710. X    CUSTOMSCREEN,    /* Screen type                */
  711. X    0,                /* Use default font for now    */
  712. X    "C64 Emulator",    /* Screen title                */
  713. X    0,                /* No gadgets                 */
  714. X    0                /* No custom bitmap            */
  715. X};
  716. X
  717. X#define NORMALFLAGS WINDOWCLOSE | WINDOWSIZING | WINDOWDEPTH | WINDOWDRAG
  718. Xstruct NewWindow NewWindow = {
  719. X    0,0,320,200,      /* Window position & Size    */
  720. X    0,1,            /* Default text colours        */
  721. X    MENUPICK      |    /* Ok, we want to know         */
  722. X    INTUITICKS,        /* about menus & timings     */
  723. X    BACKDROP      |    /* These four flags define    */
  724. X    BORDERLESS    |    /* the type of window we    */
  725. X    ACTIVATE      |    /* open. Here, we want an    */
  726. X    0       ,        /* "invisible" window.        */
  727. X    NULL,            /* No gadgets                */
  728. X    NULL,            /* Default menus check mark    */
  729. X    NULL,              /* No window title            */
  730. X    NULL,            /* Will point to our screen    */
  731. X    NULL,            /* No special bitmap used    */
  732. X    0,0,320,200,    /* No resizing so not used  */
  733. X    CUSTOMSCREEN     /* Open this on OUR screen    */
  734. X};
  735. X
  736. XUWORD blackcol[4] = {    /* All black array for initial screen   */
  737. X    0,0,0,0};
  738. X
  739. XUWORD screencol[4] = {    /* Default colours for custom screen    */
  740. X    0x077E,                /* Colour 0 = Light blue                */
  741. X    0x0EEE,                /* Colour 1 = White                        */
  742. X    0x077E,                /* Colour 2 = Lighter blue                */
  743. X    0x011C                 /* Colour 3 = Dark Blue                    */
  744. X};
  745. X
  746. Xstruct IntuiText mytext[] = {
  747. X/*  Pens   Mode   Pos   Font    Text                       Next */
  748. X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" About...",       NULL},
  749. X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" Show Title",     NULL},
  750. X{   0,1,   JAM1,  0,0,  NULL,   (UBYTE *)" Quit",           NULL}};
  751. X
  752. X
  753. X
  754. X#define MENUFLAGS ITEMTEXT | ITEMENABLED | HIGHCOMP
  755. X#define IDATA(off,str,key) 0,off,110,9,MENUFLAGS,0,str,NULL,key,NULL,NULL
  756. X
  757. Xstruct MenuItem myitems[] = {
  758. X{ &myitems[1],  IDATA( 0, (APTR)&mytext[0],  M_ABOUT)  },
  759. X{ &myitems[2],  IDATA(10, (APTR)&mytext[1],  M_TITLE)  },
  760. X{ NULL,         IDATA(20, (APTR)&mytext[2],  M_QUIT )  }};
  761. X
  762. Xstruct Menu mymenus = {NULL, 0,0,100,10, MENUENABLED, "Project", myitems};
  763. X
  764. X
  765. X/* 
  766. X * Free all resources allocated in this module
  767. X *
  768. X */
  769. X
  770. Xvoid cleanup(err)
  771. Xint err;
  772. X{
  773. X    if (openconsole)
  774. X        CloseDevice(ConReadReq);
  775. X
  776. X    if (ConReadReq)
  777. X        DeleteStdIO(ConReadReq);
  778. X
  779. X    if (ConReadPort)
  780. X        DeletePort(ConReadPort);
  781. X
  782. X    if (mywin) {
  783. X        ClearMenuStrip(mywin);
  784. X        CloseWindow(mywin);
  785. X    }
  786. X    if (myscreen)
  787. X        CloseScreen(myscreen);
  788. X
  789. X    if (IntuitionBase)
  790. X        CloseLibrary(IntuitionBase);
  791. X
  792. X    if (GfxBase)
  793. X        CloseLibrary(GfxBase);
  794. X
  795. X    exit(err);
  796. X}
  797. X
  798. X
  799. X
  800. X/* 
  801. X * Clears the screen
  802. X *
  803. X */
  804. X
  805. Xvoid clearscreen()
  806. X{
  807. X    register char *p;
  808. X    register int i;
  809. X    SetRast(rp,3);
  810. X    for (p = (char *)screen, i = 1000; i--; *p++ = ' ')
  811. X        ;
  812. X    cursorx = 0;
  813. X    cursory = 0;
  814. X}
  815. X
  816. X
  817. X/* 
  818. X * Tells console device we want to read a character from keyboard
  819. X *
  820. X */
  821. X
  822. Xvoid QueueRead(request,whereto)
  823. Xstruct IOStdReq *request;
  824. Xchar *whereto;
  825. X{
  826. X    request->io_Command    = CMD_READ;
  827. X    request->io_Data    = (APTR)whereto;
  828. X    request->io_Length    = 1;
  829. X    SendIO(request);
  830. X}
  831. X
  832. X/*  
  833. X * Initialises the screen, character set, colours etc. Exits program with
  834. X * error code if an error occurs.
  835. X *
  836. X */
  837. X
  838. Xvoid initscreen()
  839. X{
  840. X    if (!mywin) {
  841. X        if ((IntuitionBase = 
  842. X            (struct IntuitionBase *)OpenLibrary("intuition.library",0)) == 0)
  843. X            cleanup(1);
  844. X
  845. X        if ((GfxBase =
  846. X            (struct GfxBase *)OpenLibrary("graphics.library",0)) == 0)
  847. X            cleanup(2);
  848. X
  849. X        if ((myscreen = (struct Screen *)OpenScreen(&NewScreen)) == 0)
  850. X            cleanup(3);
  851. X
  852. X        LoadRGB4(&(myscreen->ViewPort),blackcol,4); 
  853. X        ShowTitle(myscreen,0);
  854. X        NewWindow.Screen = myscreen;
  855. X
  856. X        if ((mywin =  (struct Window *)OpenWindow(&NewWindow)) == 0)
  857. X            cleanup(4);
  858. X
  859. X        SetMenuStrip(mywin, &mymenus);
  860. X        rp = mywin->RPort;
  861. X
  862. X        /* Initialise communication ports for Console */
  863. X
  864. X        if ((ConReadPort = CreatePort(0,0)) == NULL)
  865. X            cleanup(5);
  866. X
  867. X        if ((ConReadReq = CreateStdIO(ConReadPort)) == NULL)
  868. X            cleanup(6);
  869. X
  870. X        ConReadReq->io_Data = (APTR)mywin;
  871. X        ConReadReq->io_Length = sizeof(*mywin);
  872. X
  873. X        /* Open console and tell it to turn off the cursor */
  874. X        if (OpenDevice("console.device",0,ConReadReq,0))
  875. X            cleanup(7);
  876. X        openconsole = 1;
  877. X
  878. X        /* Tell console to get first character ready for us */
  879. X        QueueRead(ConReadReq,constring);
  880. X
  881. X        SetAPen(rp,2);    /* Set primary colour */
  882. X        SetBPen(rp,3);    /* Set secondary colour */
  883. X        clearscreen();    /* Fill screen to raster colour */
  884. X        LoadRGB4(&(myscreen->ViewPort),screencol,4); 
  885. X
  886. X    }
  887. X}
  888. X
  889. X
  890. X/*
  891. X * Outputs a character to the screen at co-ordinates x,y. If mode is 0,
  892. X * then output normal character, else output reverse character.
  893. X *
  894. X */
  895. X
  896. Xvoid writechar(x,y,ch,mode)
  897. Xint x,y;
  898. Xchar ch;
  899. Xint mode;
  900. X{
  901. X    char s[2];
  902. X    s[0] = ch;
  903. X    Move(rp,x * 8, y * 8 + 6); /* Quick multiply by 8 */
  904. X    if (mode) {
  905. X        SetDrMd(rp,INVERSVID|JAM2);
  906. X        Text(rp,s,1);
  907. X        SetDrMd(rp,          JAM2);
  908. X    } else
  909. X        Text(rp,s,1);
  910. X}
  911. X
  912. X/* 
  913. X * Scrolls the screen up one line. Both the visible rastport screen, 
  914. X * and the internal screen are scrolled.
  915. X *
  916. X */
  917. X
  918. Xvoid scrollup()
  919. X{
  920. X    register char *p, *q;
  921. X    register int i;
  922. X
  923. X    ScrollRaster(rp,0,8,0,0,319,199);
  924. X    for (p = (char *)screen,q = (char *)screen+40, i = 960; i--; *p++ = *q++)
  925. X        ;
  926. X    for (i = 40; i--; *p++ = ' ')
  927. X        ;
  928. X    cursory--;
  929. X
  930. X}
  931. X
  932. X
  933. X
  934. X/*
  935. X * Handles special characters like CR, cursor keys etc.
  936. X *
  937. X */
  938. X
  939. Xvoid special(ch)
  940. Xchar ch;
  941. X{
  942. X    register char *p, *q;
  943. X    register int i,j;
  944. X
  945. X    switch (ch) {
  946. X
  947. X    case C_CR: /* Carriage Return */
  948. X        cursorx = 0;
  949. X        cursory++;
  950. X        if (cursory >= 25)
  951. X            scrollup();
  952. X        break;
  953. X
  954. X    case C_UP: /* Cursor Up */
  955. X        if (cursory)
  956. X            cursory--;
  957. X        break;
  958. X
  959. X    case C_DOWN: /* Cursor Down */
  960. X        cursory++;
  961. X        if (cursory >= 25)
  962. X            scrollup();
  963. X        break;
  964. X
  965. X    case C_LEFT: /* Cursor Left */
  966. X        if (cursorx == 0) {
  967. X            if (cursory) {
  968. X                cursorx = 39;
  969. X                cursory--;
  970. X            }
  971. X        } else
  972. X            cursorx--;
  973. X        break;
  974. X
  975. X    case C_RIGHT: /* Cursor Right */
  976. X        cursorx++;
  977. X        if (cursorx >= 40) {
  978. X            cursorx = 0;
  979. X            cursory++;
  980. X            if (cursory >= 25)
  981. X                scrollup();
  982. X        }
  983. X        break;
  984. X
  985. X    case C_DEL: /* Delete */
  986. X        if (cursorx == 0) {
  987. X            if (cursory) {
  988. X                cursorx = 39;
  989. X                cursory--;
  990. X                screen[cursory][cursorx] = ' ';
  991. X                writechar(cursorx,cursory,' ',0);
  992. X            }
  993. X        } else {
  994. X            ScrollRaster(rp,8,0,cursorx*8,cursory*8,319,cursory*8+7);
  995. X            /* Move chars from here to end of line back one space */
  996. X            for (q = &(screen[cursory][cursorx]),
  997. X                        p = q - 1, i = 40 - cursorx;
  998. X                        i--;
  999. X                        *p++ = *q++)
  1000. X                        ;
  1001. X            *p = ' ';
  1002. X            cursorx--;
  1003. X        }
  1004. X        break;
  1005. X
  1006. X    case C_INSERT: /* Insert */
  1007. X        if (screen[cursory][39] == ' ' && cursorx < 39) {
  1008. X            ScrollRaster(rp,-8,0,cursorx*8,cursory*8,319,cursory*8+7);
  1009. X            for (p = &screen[cursory][39], q = p - 1, i = 39 - cursorx;
  1010. X                    i--; *p-- = *q--)
  1011. X                        ;
  1012. X            *p = ' ';
  1013. X        }
  1014. X        break;
  1015. X
  1016. X    case C_CLEAR: /* Clear screen */
  1017. X        clearscreen();
  1018. X        break;
  1019. X
  1020. X    case C_HOME: /* Home cursor */
  1021. X        cursorx = 0;
  1022. X        cursory = 0;
  1023. X        break;
  1024. X
  1025. X    case C_REDRAW: /* Redraw entire screen */
  1026. X        for (i = 0; i < 25; i++)
  1027. X            for (j = 0; j < 40; j++)
  1028. X                writechar(j,i,screen[i][j],0);
  1029. X        break;
  1030. X
  1031. X    }
  1032. X}
  1033. X
  1034. X
  1035. X
  1036. X/*
  1037. X * Outputs character to screen at current cursor position, and advances
  1038. X * cursor to next position. Scrolls screen if necessary.
  1039. X *
  1040. X */
  1041. X
  1042. Xvoid printchar(ch)
  1043. Xchar ch;
  1044. X{
  1045. X    if (ch < ' ')
  1046. X        special(ch);
  1047. X    else {
  1048. X        writechar(cursorx,cursory,ch,0);
  1049. X        screen[cursory][cursorx] = ch;
  1050. X        cursorx++;
  1051. X        if (cursorx >= 40) {
  1052. X            cursorx = 0;
  1053. X            cursory++;
  1054. X            if (cursory >= 25)
  1055. X                scrollup();
  1056. X        }
  1057. X    }
  1058. X}
  1059. X
  1060. X
  1061. X/* 
  1062. X * Outputs string to screen at current cursor position
  1063. X *
  1064. X */
  1065. X
  1066. Xvoid printmess(s)
  1067. Xchar *s;
  1068. X{
  1069. X    while (*s)
  1070. X        printchar(*s++);
  1071. X}
  1072. SHAR_EOF
  1073. echo "extracting commands.h"
  1074. sed 's/^X//' << \SHAR_EOF > commands.h
  1075. X/*
  1076. X *        Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
  1077. X *
  1078. X * Module: COMMANDS.H
  1079. X *
  1080. X * This module defines the structure used to contain commands and 
  1081. X * the responses to those commands.
  1082. X *
  1083. X */
  1084. X
  1085. X#define MAXRESPONSE 3
  1086. X
  1087. Xstruct commandlist {
  1088. X    char *asc;            /* Pointer to command name (in uppercase)        */
  1089. X    int len;            /* Length of command name (speeds up matching)    */
  1090. X    int num;            /* Number of message to be printed next            */
  1091. X    char *response[MAXRESPONSE];    /* The message to print in response    */
  1092. X};
  1093. SHAR_EOF
  1094. echo "extracting screen.h"
  1095. sed 's/^X//' << \SHAR_EOF > screen.h
  1096. X/*
  1097. X *        Commodore 64 Spoof Emulator (C) Eddy Carroll, 1st April 1988
  1098. X *
  1099. X * Module: SCREEN.H
  1100. X *
  1101. X * This module contains standard definitions for all modules
  1102. X * the emulator.
  1103. X *
  1104. X */
  1105. X
  1106. X/* Control character representations */
  1107. X#define C_CR        '\r'    /* Must be real */
  1108. X#define C_UP        '\01'
  1109. X#define C_DOWN        '\02'
  1110. X#define C_LEFT        '\03'
  1111. X#define C_RIGHT        '\04'
  1112. X#define C_HOME        '\05'
  1113. X#define C_INSERT    '\06'
  1114. X#define C_CLEAR        '\07'
  1115. X#define C_DEL        '\010'    /* Must be real */
  1116. X#define C_REDRAW    '\014'    /* Control-L    */
  1117. X
  1118. X#define CSI            '\233'
  1119. X
  1120. X/* Menu keys */
  1121. X#define M_ABOUT 1
  1122. X#define M_TITLE 2
  1123. X#define M_QUIT  3
  1124. X
  1125. X/* For enabling/disabling cursor */
  1126. X#define CURSORON  writechar(cursorx,cursory,screen[cursory][cursorx],1)
  1127. X#define CURSOROFF writechar(cursorx,cursory,screen[cursory][cursorx],0)
  1128. X
  1129. X#ifndef SCREEN
  1130. X#define GLOB extern
  1131. X#endif
  1132. X#ifdef SCREEN
  1133. X#define GLOB
  1134. X#endif
  1135. X
  1136. X/*
  1137. X * Global Variables
  1138. X *
  1139. X */
  1140. X
  1141. XGLOB int cursorx, cursory;        /* Position of cursor on screen */
  1142. XGLOB int titlebar;                /* Start off with titlebar off  */
  1143. XGLOB char screen[25][40];        /* Stores characters for screen */
  1144. XGLOB struct Screen *myscreen;
  1145. XGLOB struct Window *mywin;
  1146. XGLOB struct IntuitionBase *IntuitionBase;
  1147. XGLOB struct GfxBase *GfxBase;
  1148. XGLOB char constring[5];            /* For reads from console         */
  1149. XGLOB struct IOStdReq *ConReadReq;
  1150. XGLOB struct MsgPort *ConReadPort;
  1151. X
  1152. Xextern struct MsgPort *CreatePort();
  1153. Xextern struct IOStdReq *CreateStdIO();
  1154. Xextern void DeletePort(),DeleteStdIO();
  1155. SHAR_EOF
  1156. echo "extracting C64.info.uu"
  1157. sed 's/^X//' << \SHAR_EOF > C64.info.uu
  1158. X
  1159. Xbegin 644 C64.info
  1160. XMXQ```0``````*``0`#,`'@`&``,``0`!)G```2LP````````````````````Z
  1161. XM`````TP``%X@``"I@````#L````%```````````````````````S`!T``@`"*
  1162. XM;3@#``````````````````````````````?___P`````"````@`````3___Y]
  1163. XM`````!/___D`````$P``&0`````3=O>9`````!,``!D`````$V``&0`````3:
  1164. XM```9`````!,``!D`````$P``&0`````3```9`````!,``!D`````$___^0``3
  1165. XM```3___Y``````@```(`````!____````````````````!____\`````?,S,%
  1166. XMS,````'9F9F9\```!S,S,S,\```?______\`````````````````````````*
  1167. XM``````````````````````````````````````````````````````?___P`!
  1168. XM````#____@`````/___^``````\``!X`````#P``'@`````/```>``````\`L
  1169. XM`!X`````#P``'@`````/```>``````\``!X`````#P``'@`````/```>````_
  1170. XM``____X`````#____@`````'___\````````````````````````````````7
  1171. XM``````____\`````/____X````#_____X``````````````?______\```__,
  1172. XM_____@``````````````````````````````,P`=``(``X+P`P``````````%
  1173. XM```````````````````'___\``````@```(`````$````0`````0'P\!````;
  1174. XM`!`P&8$`````$#<9@0`````0,QF!`````!`>#P$`````$````0`````0/QF!0
  1175. XM`````!`P&8$`````$#\?@0`````0,P&!`````!`_`8$`````$````0`````(X
  1176. XM```"``````?___P````````````````?____`````'S,S,S````!V9F9F?``4
  1177. XM``<S,S,S/```'_______````````````````````````````````````````I
  1178. XM```````````````````````````````````````'___\``````P```8`````3
  1179. XM#!\/!@`````,,!F&``````PW&88`````##,9A@`````,'@\&``````P```8`L
  1180. XM````##\9A@`````,,!F&``````P_'X8`````##,!A@`````,/P&&``````P`9
  1181. XM``8`````!____``````````````````````````````````````/____````3
  1182. XM`#____^`````_____^``````````````'_______```/______X`````````[
  1183. X>```````````````````!``````P````!``````$`/
  1184. X``
  1185. Xend
  1186. Xsize 1065
  1187. SHAR_EOF
  1188. echo "extracting C64.uu"
  1189. sed 's/^X//' << \SHAR_EOF > C64.uu
  1190. X
  1191. Xbegin 644 C64
  1192. XM```#\P`````````"``````````$```7.```%80```^D```7.2.=^_DOO`#0DN
  1193. XM2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
  1194. XM`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
  1195. XM20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
  1196. XM(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
  1197. XM0`!(+P`D0"`J`"1G$BQL$"`@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN,
  1198. XM_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``$"QR5
  1199. XM`"`\```!5F`")L%1R/_\3KH%?'``8`0@+P`$+P`@+``L9P0@0$Z03KH`G"QX8
  1200. XM``0B;!`@3J[^8DJL$"1G"")L$"1.KOYB2JP0*&<((FP0*$ZN_F)*K`!89P@BS
  1201. XM;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
  1202. XM3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
  1203. XMKOW8*4`0(&?:3G4``'``3G5.=4Y5``!(YP`"("P0,'(H3KH1ED'L$#C1P"`L1
  1204. XM$"S1P!(02(%(P4*G+P$O+!`P+P!.N@K.3^\`$"`M``@,@`````-G``"0#(``Y
  1205. XM```"9S0,@`````%F``"&3KH(@DJL$#1G"DAX``U.N@XJ6$\O+`X43KH.EEA/7
  1206. XM+RP.($ZZ#HQ83V!:2JP0-%?`1`!(@$C`*4`0-"!L%"0L;!0H3J[_RDJL$#1G<
  1207. XM!D'L`&A@!$'L`'0I2`[2(&P4)$/L#UPL;!0H3J[^^"!L%"`@+!`T+&P4*$ZNU
  1208. XM_N9@"$*G3KH'9%A/3-]``$Y=3G5.5?_X2.<``D'M__Q#[?_X+&P4*$ZN_ZP@>
  1209. XM+?_X(BT`"$ZZ#]X@`4S?0`!.74YU3E7_\$CG(`!"K?_\<"<K0/_X("P0,'(H4
  1210. XM3KH0?$'L$#C1P"M(__0@;?_T(BW__!`P&``,```@9@X,@0```"AL!E*M__Q@#
  1211. XMX`RM````*/_\9@@@;0`(0A!@5"!M__0B+?_X$#`8``P``"!F!E.M__A@Z"(M)
  1212. XM__RRK?_X;BP@;0`(4JT`"")M__00,1@`2(!(P"\`+T@`"$ZZ#K183R!O``00T
  1213. XM@%*M__Q@RB!M``A"$$S?``1.74YU3E4``$CG(``@;0`($!!2K0`((&T`#!(01
  1214. XM4JT`#+`!9@Q*K0`09P93K0`08-Q*K0`05\!$`$B`2,!,WP`$3EU.=4Y5__!(7
  1215. XMYR`P0JW__"(L#7(D+?_\M(%L3B\!80#^PEA/+RP-<BM`__AA`/ZT6$\B+`URD
  1216. XMDH!3@2`M__CE@$'L#2(B2-/`)%$B2-/`(`'E@"9(U\`BD]'`((HK0?_T*TK_H
  1217. XM\%*M__Q@IDS?#`1.74YU3E7_Z$CG(`!P`2M`__QP_RM`__@@;0`($A`,`0`P.
  1218. XM;0P,`0`Y;@9"K?_X8$0B+?_\LJP*R&PZ2JW_^&HT<!A.N@[T0>P(T")(T\#1.
  1219. XMP"\H``0O+0`(+Q%A`/[Z3^\`#$J`9P@@+?_\*T#_^%*M__Q@O$AX``U.N@NHC
  1220. XM6$]*K?_X:P``C"`M__AR&$ZZ#JI![`C0T<`K2/_H(&W_Z%*H``@,J`````,`W
  1221. XM"&U`0J@`"$AX``-A`/V^6$](>``#*T#_]&$`_;!83R(M__3E@2)M_^@@<1@,6
  1222. XM)`#E@B.Q*`P8#".(*`PK0/_P*TC_["!M_^@@*``(Y8`@<`@,*TC_[+#\``!G,
  1223. XMEB\M_^Q.N@N.6$]@*B`L`(#E@$'L#2+1P"\03KH+>%A/4JP`@"(L`("RK`URG
  1224. XM;0A"K`"`80#^7B\L#B!.N@M86$],WP`$3EU.=4Y5__A"K?_\(BW__+*L"LAL"
  1225. XM*'`83KH-UD'L"-#1P$AX``,O2``$80#]`%A/(&\``"%```A2K?_\8,Y.74YU"
  1226. XM3E7__DCG(0!^`"`M``@,@````!1G&`R`````$V<,#(`````)9A1^!6!*?@=@5
  1227. XM1DAL`(1.N@K:6$]@.DJM``A:P$0`2(!(P"0M``@,@@```!-?P40!2(%(P<"!*
  1228. XM2H!G%B`"<AA.N@U*0>P(T-'`+Q!.N@J>6$\@!TS?`(1.74YU3E4``!`M``M(U
  1229. XM@`1``$%M-`Q```1L+N-`3OL``F`&8`Q@$F`8&WP``0`+8!P;?``"``M@%!M\(
  1230. XM``0`"V`,&WP``P`+8`1"+0`+$"T`"TY=3G5.5?^F2.<P(G``<@,K0?_B*4`0H
  1231. XM-"M`_]XK0/_L3KH$;F$`_M)A`/T8+RP-QDZZ"A)83R\L#B!.N@H(6$\@+!`P"
  1232. XM<BA.N@R<0>P0.-'`("P0+-'`$A!(@4C!2'@``2\!+RP0,"\`3KH%TD_O`!"5:
  1233. XMRD*M__`B;!0D(&D`5BQX``1.KOZ,)$"T_```9D8@;!0Z+'@`!$ZN_HPK0/_P=
  1234. XM2JW_\&8P(FP4)"!I`%9P`!`H``]R`20!X:)P`"!L%#H0*``/)@'AHX2#(`(L$
  1235. XM>``$3J[^PF"BM/P``&<``08K:@`4_^@[:@`8_^8B2BQX``1.KOZ&("W_Z`R`>
  1236. XM`$```&=@#(````$`9@``VG``,"W_YBM`__PB+?_\#($``/__9RY![`]<("W_Z
  1237. XM_"QL%"A.KO]P*T#_^"!M__@0*``:2(!R`#(H`"`[0/_F*T'__&#&<``P+?_F&
  1238. XM+P!A`/GH6$]@``"$2JW_XF9X<`$B`)*M_]XK0?_>2H%G,B`L$#!R*$ZZ"VA!P
  1239. XM[!`XT<`@+!`LT<`2$$B!2,%(>``!+P$O+!`P+P!.N@2>3^\`$&`N("P0,'(HY
  1240. XM3KH+-D'L$#C1P"`L$"S1P!(02(%(P4*G+P$O+!`P+P!.N@1N3^\`$'`#*T#_D
  1241. XMXF`$4ZW_XDJM__!G`/Z*&VP4,/^G2&P4,"\L%#9.N@)B4$\2+?^G#`$`FV8.6
  1242. XM<`%"K?_:*T#_[&``_EY*K?_L9P``GDB!2,$O`4ZZ"0A83TJ`9R8@+?_:<@I.[
  1243. XMN@JP$BW_ITB!2,'0@02`````,'(`*T#_VAM!_Z=@9@PM`#__IV8.<!1R`"M`A
  1244. XM_]H;0?^G8%`,+0`@_Z=F#G`"*T#_['``&T#_IV`Z0JW_[`PM`'[_IV80+RW_9
  1245. XMVF$`_*983QM`_Z=@'@RM`````O_L9Q00+?^G2(!(P"\`80#]!%A/&T#_IR`L<
  1246. XM$#!R*$ZZ"B1![!`XT<`@+!`LT<`2$$B!2,%"IR\!+RP0,"\`3KH#7$_O`!`,'
  1247. XM+0`-_Z=F+$AM_ZAA`/E:6$\0+?^G2(!(P"\`3KH&REA/2BW_J&<J2&W_J&$`V
  1248. XM^IQ83V`>#"T`?_^G9@9P!AM`_Z<0+?^G2(!(P"\`3KH&FEA/("P0,'(H3KH)D
  1249. XMI$'L$#C1P"`L$"S1P!(02(%(P4AX``$O`2\L$#`O`$ZZ`MI/[P`0<`,K0/_BC
  1250. XM<`$K0/_>8`#\^DY5``!(YP`"2JP.)&<,(FP4-BQX``1.KOX^2JP4-F<*+RP46
  1251. XM-DZZ"\)83TJL%#IG"B\L%#I.N@M86$]*K!0D9Q@@;!0D+&P4*$ZN_\H@;!0DP
  1252. XM+&P4*$ZN_[A*K!0@9PP@;!0@+&P4*$ZN_[Y*K!0H9PPB;!0H+'@`!$ZN_F)*N
  1253. XMK!0L9PPB;!0L+'@`!$ZN_F(O+0`(3KH&O%A/3-]``$Y=3G5.5?_X2.<!(B)L9
  1254. XM%#YP`RQL%"Q.KO\61>P0."X\```#Z"`'4X=*@&<(%+P`(%**8/!P`"E`$"PI0
  1255. XM0!`P3-]$@$Y=3G5.5?_\2.<``B!M``@Q?``"`!PA;0`,`"AP`2%``"0O2``$_
  1256. XM(F\`!"QX``1.KOXR3-]``$Y=3G5.5?_\2.<``DJL%"1F``&60^P/>G``+'@`(
  1257. XM!$ZN_=@I0!0H2JP4*&8*2'@``6$`_KI83T/L#XQP`"QX``1.KOW8*4`4+$JLO
  1258. XM%"QF"DAX``)A`/Z86$]![`XV+&P4*$ZN_SHI0!0@2JP4(&8*2'@``V$`_GA8S
  1259. XM3R!L%"#0_``L+T@`!"!O``1#[`Z&<`0L;!0L3J[_0"!L%"!P`"QL%"A.KO[F#
  1260. XM*6P4(`YT0>P.5BQL%"A.KO\T*4`4)$JL%"1F"DAX``1A`/XF6$\@;!0D0^P/0
  1261. XM7"QL%"A.KO[X(&P4)"EH`#(4/G``+P`O`$ZZ"/A03RE`%#I*@&8*2'@`!6$`'
  1262. XM_>Y83R\L%#I.N@FX6$\I0!0V2H!F"DAX``9A`/W26$\@;!0V(6P4)``H(&P48
  1263. XM-B%\````A``D0>P/GG``(FP4-G(`+'@`!$ZN_D1*@&<*2'@`!V$`_9I83W`!'
  1264. XM*4`.)$AL%#`O+!0V80#^:%!/(FP4/G`"+&P4+$ZN_JHB;!0^<`,L;!0L3J[^1
  1265. XMI&$`_@0@;!0@T/P`+"](``0@;P`$0^P.CG`$+&P4+$ZN_T!,WT``3EU.=4Y5;
  1266. XM__9(YP`"&VT`$__^("T`".>`(BT`#.>!7($O0``$+T$`"")L%#X@+P`$(B\`)
  1267. XM""QL%"Q.KO\02JT`%&<P(FP4/G`%+&P4+$ZN_IXB;!0^0>W__G`!+&P4+$ZNB
  1268. XM_\0B;!0^<`$L;!0L3J[^GF`2(FP4/D'M__YP`2QL%"Q.KO_$3-]``$Y=3G5.P
  1269. XM5?_T2.<!($AX`,=(>`$_<``O`"\`2'@`""\`+RP4/DZZ"9)/[P`<1>P0.$'LT
  1270. XM$&`N/````\`K2/_X(`=3ATJ`9PX@;?_X%)!2K?_X4HI@ZGXH(`=3ATJ`9P@4_
  1271. XMO``@4HI@\%.L$#!,WP2`3EU.=4Y5__!(YR,@$"T`"TB`!$```6T``H`,0``-%
  1272. XM;``">.5`3OL``F```$Y@``!:8```;F```(Y@``(08``!;F```@)@``"J8``"+
  1273. XM3F```DI@``)&8``"`&````)"K!`L4JP0,`RL````&1`P;0`"*F$`_R1@``(B`
  1274. XM2JP0,&<``AI3K!`P8``"$E*L$#`,K````!D0,&T``@)A`/[\8``!^DJL$"QFZ
  1275. XM%DJL$#!G``'L<"<I0!`L4ZP0,&```=Y3K!`L8``!UE*L$"P,K````"@0+&T`/
  1276. XM`<9"K!`L4JP0,`RL````&1`P;0`!LF$`_JQ@``&J2JP0+&9&2JP0,&<``9QP^
  1277. XM)RE`$"Q3K!`P("P0,'(H3KH$ID'L$#C1P"`L$"S1P!"\`"!"ITAX`"`O+!`P2
  1278. XM+RP0+&$`_=Q/[P`08``!7B`L$"SG@"(L$##G@20!7H(O`DAX`3\O`2\`0J=()
  1279. XM>``(+RP4/DZZ!^A/[P`<("P0,'(H3KH$1D'L$#C1P"`L$"S1P"M(__A3B"1(&
  1280. XMDH`N`2`'4X=*@&<.(&W_^!204JW_^%**8.H4O``@4ZP0+&```.X@+!`P<BA.R
  1281. XMN@0"0>P0.-'`$"@`)PP``"!F``#2(BP0+`R!````)VP``,0@`>>`(BP0,.>!U
  1282. XM)`%>@B\"2'@!/R\!+P!"ITAX__@O+!0^3KH'4$_O`!P@+!`P<BA.N@.N0>P0W
  1283. XM.-'`T/P`)R1(($H@2E.(<">0K!`L+@`K2/_X(`=3ATJ`9PX@;?_X%)!3K?_X=
  1284. XM4XI@ZA2\`"!@5&$`^J1@3G``*4`0+"E`$#!@0GX`#(<````9;#A\``R&````T
  1285. XM*&PJ(`=R*$ZZ`T9![!`XT<#1QA`02(!(P$*G+P`O!R\&80#\A$_O`!!2AF#.5
  1286. XM4H=@P$S?!,1.74YU3E4``!(M``L,`0`@;`Y(@4C!+P%A`/U.6$]@5DB!2,%"-
  1287. XMIR\!+RP0,"\L$"QA`/Q`3^\`$"`L$#!R*$ZZ`MI![!`XT<`@+!`LT<`0K0`+E
  1288. XM4JP0+`RL````*!`L;19"K!`L4JP0,`RL````&1`P;01A`/R&3EU.=4Y5```@7
  1289. XM;0`(2A!G%!`02(!(P%*M``@O`&$`_W!83V#D3EU.=4Y5__Q(YR``<``I0``8W
  1290. XM2JT`"&LD)"T`"+2L$!QL&B("YX%![!1$(DC3P4J19PHB`N>!T<$@"&`(<`DID
  1291. XM0`^P<`!,WP`$3EU.=0`````````````````````"?P#'`````$Y5__1(YP`@Y
  1292. XM1>P/M+3\``!G-@@J``(`&V8J""H``0`;9R(@*@`$D*H`$"M`__A*@&<2+P`O2
  1293. XM*@`0+RH`'$ZZ`*I/[P`,)%)@Q"\M``A.N@'N6$],WP0`3EU.=0``````````D
  1294. XM<&%.50``(BT`"`R!````,&T,#($````Y;@1P`6`"<`!.74YU``!.5?_V+RT`>
  1295. XM"$ZZ_PY83RM`__9*@&8$</]@*B\M`!`O+0`,(&W_]B\H``1.N@(L3^\`#"M`M
  1296. XM__I*K``89P1P_V`$("W_^DY=3G4@+P`$#```86T*#```>FX$!```($YU``!.=
  1297. XM5?_X+RT`"$ZZ_JY83RM`__A*@&8$</]@2"!M__@(*``#``-G$DAX``)"IR\MR
  1298. XM``A.NO]N3^\`#"\M`!`O+0`,(&W_^"\H``1.N@%23^\`#"M`__Q*K``89P1PN
  1299. XM_V`$("W__$Y=3G4``````%```'!A2H!J```>1(!*@6H```Q$@6$``"!$@4YU?
  1300. XM80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```B2$!(04A"-`!GF
  1301. XM```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AF5%##$$(`&0`J
  1302. XM``;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"YJI(0X#!-@`PQ
  1303. XM`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$##0"8?)!].=2!"(D,D`"8!'
  1304. XM2$)(0\3!QL#`P=1#2$)"0M"")@DD"$YU3E7_^$CG`2!^`$7L%$2^K!`<;!Y*1
  1305. XMDF<4""H``@`#9P)@"B\J``1.N@$06$]2AU"*8-PO+0`,+RT`"$ZZ[4Y03TS?\
  1306. XM!(!.74YU3E7__$CG`0!*K``P9P1.NNW<0JP`&"(M``@D+0`,)BT`$"QL$"!.5
  1307. XMKO_0+@`,A_____]F$BQL$"!.KO]\*4``&'`%*4`/L"`'3-\`@$Y=3G4```!0?
  1308. XM``-S``#_@`!.5?_X2.<Q`DJL`#!G!$ZZ[8!"K``8("T`$%.`+T``$"(M``@DG
  1309. XM+0`,)B\`$"QL$"!.KO^^+@`,A_____]F$BQL$"!.KO]\*4``&'`6*4`/L"`M/
  1310. XM`!`,@`````)G'`R``````6<*2H!F(B`M``Q@'"`'(`?0K0`,8!(B+0`(=`!V0
  1311. XM`"QL$"!.KO^^3G%,WT",3EU.=0``3E4``$JL`#!G!$ZZ[/`B+0`(+&P0($ZN8
  1312. XM_]QP`$Y=3G4@;P`$((A8D$*H``0A2``(3G4``$CG/"`F+P`8%"\`'WK_+P5.3
  1313. XMN0``%L@2`'``$`$H`'+_LH!8CV8$<`!@9B\\``$``4AX`").N0``%H0D0"H*$
  1314. XM4(]F#B\$3KD``!;<<`!8CV!`)4,`"A5"``D5?``$``A"*@`.%40`#T*G3KD`W
  1315. XM`!:T)4``$$J#6(]G"B\*3KD``!;P8`I(:@`43KD``!3\6(\@"DS?!#Q.=2\*I
  1316. XM)&\`"$JJ``IG"B\*3KD``!<$6(\5?`#_``AP_R5``!1P`!`J``\O`$ZY```61
  1317. XMW$AX`"(O"DZY```6G$_O``PD7TYU```@+P`$2'@`,"\`3KD``!804(].=2`O0
  1318. XM``0O`$ZY```64EB/3G5(YS@`)"\`$"8O`!1*@F8$<`!@*"\\``$``2\#3KD`3
  1319. XM`!:$($`H"%"/9@)@Y!%\``4`"#%#`!(A0@`.(`A,WP`<3G4@;P`$(`AF`F`D?
  1320. XM$7P`_P`(</\A0``4</\A0``8<``P*``2+P`O"$ZY```6G%"/3G4``"\.+'D`=
  1321. XM``!`3.\``P`(3J[_.BQ?3G4``"\.+'D```!`(F\`""`O``Q.KO\N+%].=2\.3
  1322. XM+'D```!`(F\`"$ZN_MHL7TYU+PXL>0```$`@+P`(3J[^MBQ?3G4O#BQY````Y
  1323. XM0"`O``A.KOZP+%].=2\.+'D```!`(F\`"$ZN_IXL7TYU+PXL>0```$`B;P`(K
  1324. XM3J[^F"Q?3G5(YSP"+'D``!0L(F\`&$SO`#\`'$ZN_G1,WT`\3G4``````^P`X
  1325. XM```-````````%BX``!9Z```5^```%@@``!5&```5(@``%7H``!72```55@``_
  1326. XM%8P``!68```5M@``%=X````*`````0``%QX``!<(```6]```%N```!;,```6C
  1327. XMN```%J```!:(```!$@````X````````#\@```^H```0+````````````````>
  1328. XM`````````````````````````````````````````````````````````````
  1329. XM``````````````````````````````````````````````!D;W,N;&EB<F%RP
  1330. XM>0`@2&ED92!4:71L90`@4VAO=R!4:71L90``````2$5,4`````!(;6UM+BXN:
  1331. XM82!W;W5L9"UB92!P<F]G<F%M;65R+"!E:#\-``!);B!F86-T+"!T:&ES(&5M,
  1332. XM=6QA=&]R(&1O97-N)W0-86-T=6%L;'D@96UU;&%T92!04D]'4D%-4RX-``!'Q
  1333. XM3R!!34E'00``06@@+2!V97)Y(&=O;V0A($EF('EO=2!C86X@:&%V92!'3R`V"
  1334. XM-`UO;B!A($,Q,C@L('=H>2!N;W0@1T\@04U)1T$-``!.86@N+BYT:&%T('=O,
  1335. XM;B=T('=O<FL-``!,25-4```S($)A9W,@1FQO=7(--B!$;WH@16=G<PTQ($QO\
  1336. XM868@0G)E860-`#$@,RXU(B!$:7-K($1R:79E#3$@0V]L;W5R($UO;FET;W(-'
  1337. XM,2!!;6EG82`U,#`-`$Q/040B)"(`66]U('=A;G0@82!D:7)E8W1O<GD_(%1RL
  1338. XM>2!A('!H;VYE#6)O;VL@:6YS=&5A9"X-``!3;W)R>2`M($D@9&]N)W0@9F5E0
  1339. XM;"!U<"!T;R!D:7-K(&%C8V5S<PUJ=7-T(&%T('1H92!M;VUE;G0N($EN(&9A6
  1340. XM8W0L($DG;2!F965L:6YG<F%T:&5R(&1E<')E<W-E9"!I9B!Y;W4@;75S="!K_
  1341. XM;F]W+@U"<F%I;B!T:&4@<VEZ92!O9B!A('!L86YE="P@86YD('=H870-9&\@D
  1342. XM<&5O<&QE(&1O("T@=')Y(&%N9"!G970@80U$25)%0U1/4EDN($D@9&]N)W0@M
  1343. XM:VYO=R!W:&%T('1H90UW;W)L9"!I<R!C;VUI;F<@=&]O+BXN#0``3&]O:RP@L
  1344. XM:68@>6]U('1R>2!T:&%T($].0T4@;6]R92!))VQL#6)E('9E<GD@8W)O<W,-M
  1345. XM`$Q/040``$5R;2XN+DDG;2!A9G)A:60@=&AA="!T:&ES(&5M=6QA=&EO;@UDZ
  1346. XM;V5S;B=T(&5M=6QA=&4@=&AE($Q/040@8V]M;6%N9"X-`$%N9"!J=7-T(&AOH
  1347. XM=R!D;R!Y;W4@97AP96-T(&UE('1O#6%C8V]M<&QI<V@@=&AA="!O;B!A;B!!3
  1348. XM;6EG83\-``!/:RP@22=,3"!L;V%D(&$@<')O9W)A;2!W:&5N(%E/52!S:&]WA
  1349. XM#6UE('=H97)E('EO=2=V92!P;'5G9V5D(&EN('1H92`Q-30Q#0``4E5.`$]H=
  1350. XM($=O9"P@;F]T(&%N;W1H97(@;VYE(&]F('1H97-E#6ME97`M9FET(&%D9&ECO
  1351. XM=',N#0!#86XG="`M(&UY(&%N:VQE)W,@='=I<W1E9"$-``!3059%``!997,AZ
  1352. XM(%EE<R$@665S(2!7:71H('1H92!%+D(N4RX-`$]N;'D@2F5S=7,@8V%N(&1OC
  1353. XM('1H870N#0``0TQ/4T4`2&UM("XN+B!A;F]T:&5R(%!U8FQI8R!H;VQI9&%YH
  1354. XM/PT``%-H=70@=7`L('EO=7)S96QF(0T`0TQ2`"XN+B!A<R!C;&5A<B!A<R!MO
  1355. XM=60L($D@<F5C:V]N+@T`3VMA>2P@22=M('1H:6YK:6YG(&-L96%R;'D@;F]W$
  1356. XM+@U%=F5R>71H:6YG(&UA:V5S('!E<F9E8W0@<V5N<V4-1&%I<WDL('=H97)E&
  1357. XM(&%R92!Y;W4@;F]W/PT`4&%R9&]N/PT``$-/3E0``%=O;B=T(&-O;G1I;G5E-
  1358. XM(&5R<F]R#0!386UE('1O('EO=2!W:71H(&MN;V)S(&]N(0T`1$%400``0FQI2
  1359. XM;F0@9&%T82!E<G)O<BX-``!9;W4@;&EK92!0;VQI8V4@<F5C;W)D<RP@=&AEN
  1360. XM;C\-`$1)30!)(&%M(&YO="$-``!)="=S(&1A<FL@96YO=6=H+"!T:&%N:W,NL
  1361. XM#0``3VMA>2P@<'5T(&]N('1H92!S<&5C<RP@:70G<R!I;@TS+60@9G)O;2!N/
  1362. XM;W<@;VXN#0!%3D0`+BX@;V8@=&AE('5N:79E<G-E(#\-`$]K87DL($DG;2!FG
  1363. XM:6YI<VAE9"!W;W)K:6YG+@T``$=%5`!))VT@;F]T(&=E='1I;F<@86YY;6]RV
  1364. XM92!M97-S86=E<PUF;W(@>6]U+@T``$D@9V]T('1H870@>65S=&5R9&%Y(0T`5
  1365. XM`$D@;F5V97(@9V5T('1H870@:VEN9"!O9B!J;VME+@T`1T]354(`26YT;R!SF
  1366. XM=6)M87)I;F5S+"!A<F4@=V4_#0!/:V%Y+"!B=70@22!W;VXG="!R971U<FXNC
  1367. XM#0``3F\A(%5S92!P<F]C961U<F5S+@T``$=/``!))VT@9F5D('5P(&=O:6YG*
  1368. XM(&AE<F4L(&=O:6YG('1H97)E#6%N9"!N979E<B!A('=O<F0@;V8@=&AA;FMS7
  1369. XM+@T`3F]W('=H97)E/PT`22=V92!A;')E861Y(&)E96X@=&AE<F4@+2!I="=S9
  1370. XM('9E<GD-8F]R:6YG+@T``$E&``!.;R`G:69S)RP@8F4@<W5R92$-`$EF($D@#
  1371. XM=V5R92!A(')I8V@@;6%N+BXN#0``24Y0550`07-K('=H871E=F5R('EO=2!WV
  1372. XM86YT+"!))VT@;F]T#71E;&QI;F<N#0``66]U)VQL(&AA=F4@=&\@87-K('-OX
  1373. XM;65O;F4@96QS92X-`$Q%5`!,970@8GEG;VYE<R!B92!B>6=O;F5S+@T``$QEC
  1374. XM="!I="!B92X-`%1H:7,@8V]M<'5T97(@:7,@;F]T('1O(&QE="X-`$Y%5P!/#
  1375. XM:V%Y+"!))VT@8G)A;F0@;F5W+@T`3F\@;F5W<R!T;V1A>2`N+B!S;W)R>2$->
  1376. XM``!35$]0``!!<G)G9V=H:&@@+BX@8V%N)W0@<W1O<"!N;W<N#0!38V-R<F5E=
  1377. XM965E8V@@+BXN+@T``$)L0$!D>2!L;VQL:7!O<"!P97)S;VXA#0``````````:
  1378. XM``0`````````C````+``````````[`````0`````````]@```3H````````!B
  1379. XM4@````0````````!6````7X````````!K@````<````````!M@```>@```+6<
  1380. XM```#"@````0````````#$````U@```.8```#Y`````,````````#Z```!!P`/
  1381. XM```````$.@````0````````$0```!&`````````$>@````4````````$@```Q
  1382. XM!*(````````$M@````,````````$N@``!-H```4T```%/@````0````````%$
  1383. XM1```!5H````````%=@````0````````%?```!9`````````%L`````,`````P
  1384. XM```%M```!<````7<```&#@````,````````&$@``!B@````````&1@````,`+
  1385. XM```````&2@``!G8```:.```&K@````4````````&M```!LX```;J```'````>
  1386. XM``(````````'!```!T0```=0```'?@````(````````'@@``!Y8````````'C
  1387. XML`````4````````'M@``!^`````````(`@````,````````(!@``""````@L0
  1388. XM```(2@````0````````(3@``"&0````````(?@````0````````(A```"*(`8
  1389. XM``BV````$S]4;V\@;6%N>2!F:6YG97)S(&]N(&ME>6)O87)D(&5R<F]R#0``J
  1390. XM/U-T<FEN9R!T;V\@=&%N9VQE9"!E<G)O<@T``#]&;W)M=6QA('1O;R!B;W)I1
  1391. XM;F<@97)R;W(-```_3F]V:6-E('!R;V=R86UM97(@97)R;W(-`#]#;VUP=71E>
  1392. XM<B!T;V\@8G5S>2!E<G)O<@T`/T%T87)I($]W;F5R(&EN('9I8VEN:71Y(&5RV
  1393. XM<F]R#0`_0V]M;6%N9"!T;V\@=')I=FEA;"!E<G)O<@T`/TAA<F1W87)E(&UA=
  1394. XM;&9U;F-T:6]N(&5R<F]R#0``/TYO('-I;'9E<B!L:6YI;F<@;VX@8VQO=60@/
  1395. XM97)R;W(-`#]996%R(&YO="!A(&QE87`@>65A<B!E<G)O<@T``#](>7!E<BUS*
  1396. XM<&%C92!M:7-D:7)E8W1I;VX@97)R;W(-```_365M;W)Y(&5M<'1Y(&5R<F]RK
  1397. XM#0``/TYO(&)I=',@=&\@8FET92!E<G)O<@T`/T-O;6UO9&]R92`V-"!I;F-OP
  1398. XM;7!A=&EB:6QI='D@97)R;W(-```_26YV86QI9"!L97AI8V%L(&EN9&EC871OR
  1399. XM<B!E<G)O<@T`/S1T:"!D:6UE;G-I;VYA;"!E<G)O<@T`/TYT:"!D:6UE;G-I4
  1400. XM;VYA;"!E<G)O<@T`/T]U="!O9B!T:&ES('=O<FQD(&5R<F]R#0`_5&]O(&UA#
  1401. XM;GD@=7-E<G,@;VX@<WES=&5M(&5R<F]R#0``/U1O;R!M86YY(&-H87)A8W1ES
  1402. XM<G,@;VX@<V-R965N(&5R<F]R#0````K,```*\@``"PX```LJ```+1```"UX`Q
  1403. XM``M^```+F@``"[@```O:```+^```#!H```PP```,2```#&X```R0```,J```9
  1404. XM#,````S:```,_````!0-("`@("HJ*BH@0V]M;6]D;W)E(#8T($)A<VEC(%8R\
  1405. XM("HJ*BH-#2`V-$L@4F%M(%-Y<W1E;2`@,S@Y,3$@0F%S:6,@0GET97,@1G)E(
  1406. XM90T-````#78-("`@("`J*BH@0V]M;6]D;W)E(#8T($5M=6QA=&]R("HJ*@T-=
  1407. XM("`@(&)Y($5D9'D@0V%R<F]L;"`Q<W0@07!R:6P@,3DX.`T-````#<I296%DG
  1408. XM>2X-````#A@`````0S8T($5M=6QA=&]R`````````4``R``"``$````/````+
  1409. XM````#B@````````````````!0`#(``$`0`$````9````````````````````:
  1410. XM``````````````%``,@`#P``````````!WX.[@=^`1P@06)O=70N+BX`(%-H[
  1411. XM;W<@5&ET;&4`(%%U:70```$````````````````.E@```````0``````````Q
  1412. XM``````Z@```````!````````````````#JP````````/$```````;@`)`%(`1
  1413. XM```````.L@`````!````````````#S(````*`&X`"0!2````````#L8`````I
  1414. XM`@``````````````````%`!N``D`4@````````[:``````,`````````4')O[
  1415. XM:F5C=`````````````!D``H``0``#U0```[N``````````!I;G1U:71I;VXN%
  1416. XM;&EB<F%R>0!G<F%P:&EC<RYL:6)R87)Y``!C;VYS;VQE+F1E=FEC90``````Z
  1417. XM```````/U@``````````````````````````````````````````#_@`````L
  1418. XM`````````````````````````````````````````````````````````````
  1419. XM```````````````````````````H```````````````````#[````&L````!#
  1420. XM```/U@``#[0```]N```/:@``#T0```\B```/$```#P````[N```.Y@``#M(`@
  1421. XM``Z^```.2@``#B````X4```-Q@``#6X```UJ```-9@``#6(```U>```-6@``M
  1422. XM#58```U2```-3@``#4H```U&```-0@``#3X```TZ```--@``#3(```TN```-R
  1423. XM*@``#28```TB```*Q```"L````J\```*L```"J@```JD```*F```"I0```J0>
  1424. XM```*C```"H````IX```*=```"F@```I@```*7```"E````I,```*2```"D0`R
  1425. XM``HX```*-```"C````HL```*(```"AP```H8```*%```"@@```H````)_```A
  1426. XM"?````GL```)Z```">0```G8```)T```"<P```G````)N```";0```FH```)<
  1427. XMI```":````F<```)D```"8@```F$```)>```"7````EL```)8```"5@```E4_
  1428. XM```)2```"40```E````)/```"3````DL```)*```"20```D8```)$```"0P`'
  1429. X?``D````(^```"/0```CH```(X```"-P````````#\B0`:
  1430. X``
  1431. Xend
  1432. Xsize 10696
  1433. SHAR_EOF
  1434. echo "End of archive 1 (of 1)"
  1435. # if you want to concatenate archives, remove anything after this line
  1436. exit
  1437.